/*
 * 监控区主页的主区域, 含消息汇总和消息传递部分
 * @author Zdream
 * @since 0.2.0
 */

var monitor = {
		
	/*
	 * 消息部分
	 */
	msgCenter : {
		/**
		 * 事件列表
		 * 里面每一个参数都是 Array(Function) | Array(Object)
		 * 
		 * object 为:
		 * {
		 *   name : <string>,
		 *   func : <function>
		 * }
		 */
		events: {},

		/**
		 * 注册监听的事件
		 * @param event  String|Array(String)
		 *  想要接受的事件类型
		 * @param callback  Function(event, argv)
		 *  回调函数
		 * @param name
		 *  名称. 为这个事件添加一个名称, 允许它能够被找到
		 */
		subscribe: function(event, callback, name) {
			if (typeof event == 'string') {
				this.subscribeOne(event, callback, name);
			} else if (event instanceof Array) {
				var len = event.length;
				for (var i = 0; i < len; i++) {
					this.subscribe(event[i], callback, name);
				}
			}
		},

		/**
		 * 注册一个监听的事件
		 * @param event  String
		 *  想要接受的事件类型
		 * @param callback  Function(event, argv)
		 *  回调函数
		 * @param name
		 *  名称. 为这个事件添加一个名称, 允许它能够被找到
		 */
		subscribeOne: function(event, callback, name) {
			var funcs = this.events[event];
			if (funcs == null) {
				funcs = [];
				this.events[event] = funcs;
			}
			
			if (name != null) {
				funcs.push({
					name : name,
					func : callback
				});
			} else {
				funcs.push(callback);
			}
		},

		/**
		 * 发布事件
		 * @param event  String
		 *   事件名称
		 * @param argv  任意
		 *   其它附属参数
		 * @return Promise 参数
		 */
		release: function(event, argv) {
			var funcs = this.events[event];
			
			if (funcs == null || funcs.length == 0) {
				console.log("release no-response: " + event);
				console.log(argv);
				return Promise.resolve(0);
			}
			
			function createPromise(func) {
				var f = func;
				if (typeof(f) == 'object') {
					f = f.func;
				}
				
				if (typeof(f) == 'function') {
					return new Promise(function (resolve, reject) {
						f(event, argv);
						resolve(1);
					});
				} else {
					console.error("monitor-message: 无法解析下列事件监听 (" + event + ")");
					console.error(func);
				}
			}
			
			var ps = [];
			var len = funcs.length;
			for (var i = 0; i < len; i++) {
				ps.push(createPromise(funcs[i]));
			}
			
			return Promise.all(ps);
		},
		
		/**
		 * 删除 name 对应的所有的 func
		 */
		remove: function(name) {
			for (var key in this.events) {
				var array = this.events[key];
				
				for (var i = array.length - 1; i >= 0; i--) {
					var o = array[i];
					if (typeof(o) == 'object') {
						if (o.name == name) {
							array.splice(i, 1);
						}
					}
				}
				
				if (array == null) {
					delete this.events[key];
				}
			}
		}
	},
	
	ui : {}
}

window.onload = function () {
	monitor.msgCenter.release("window-onload");
}
